<?php
namespace tp5_lib\user\model;

use think\Model;

/**
 * 用户模型
 * 注意:所有的操作之前都需要额外的操作验证数据是否正确，否则会导致错误
 * @property string $id
 * @property string $username
 * @property string $password 加密过的密码
 * @property string $secret 加密密码的随机密钥
 * @property string $mobile
 * @property string $email
 * @property string $score
 * @property string $coin
 * @property string $create_time
 * @property string $status
 * @property string $nickname
 * @property string $avatar
 * @property string $signature
 * @property string $sex 0,未知;1,男;2,女
 * @property string $birthday
 * @property string $url
 * @property string $last_login_time
 * @property string $last_login_ip
 * @property string $token
 */
class UserModel extends Model
{
    protected $table="user";
    public function install()
    {
        $table=$this->db()->getTable();
        $sql="CREATE TABLE IF NOT EXISTS `$table` (
            `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
            `username` varchar(40) NOT NULL,
            `password` varchar(40) NOT NULL,
            `secret` varchar(10) NOT NULL,
            `mobile` varchar(20) NOT NULL DEFAULT '',
            `email` varchar(40) NOT NULL DEFAULT '',
            `score` int(11) NOT NULL DEFAULT '0',
            `coin` int(11) NOT NULL DEFAULT '0',
            `create_time` int(11) NOT NULL,
            `status` int(11) NOT NULL DEFAULT '0',
            `nickname` varchar(20) NOT NULL DEFAULT '',
            `avatar` varchar(100) NOT NULL DEFAULT '',
            `signature` varchar(100) NOT NULL DEFAULT '',
            `sex` int(11) NOT NULL DEFAULT '0',
            `birthday` int(11) NOT NULL DEFAULT '0',
            `url` varchar(100) NOT NULL DEFAULT '',
            `last_login_time` int(11) NOT NULL DEFAULT '0',
            `last_login_ip` varchar(20) NOT NULL DEFAULT '',
            `token` varchar(40) NOT NULL DEFAULT ''
        ) ENGINE=MyISAM DEFAULT CHARSET=utf8;";
        $this->db()->execute($sql);
    }
    /**
     * 检查用户信息唯一字段是否有重复
     * @param array $data [mobile],[username],...
     * @return bool
     */
    public function checkUnique($data)
    {
        $where=[];
        foreach($data as $key => $value){
            if(in_array($key,["mobile","username"])){
                $where[$key]=$value;
            }
        }
        $record=$this->db()->where($where)->find();
        if($record){
            $this->error="手机号或用户名已被占用";
            return false;
        }
        return true;
    }
    /**
     * 加密密码
     * @param string $content 需要加密的内容
     * @param string $secret 密钥
     * @return string
     */
    public function encrypt($content,$secret)
    {
        $encryptString=$secret.$content.$secret;
        $encrypted=sha1($encryptString);
        return $encrypted;
    }
    /**
     * 登录检查
     * 检查用户是否存在，密码是否正确
     * @param string $password 要验证的密码
     * @return self|false
     */
    public function checkUser($where,$password)
    {
        $user=$this->db()->where($where)->find();
        if(!$user){
            $this->error="用户不存在";
            return false;
        }

        $password=$this->encryptPassword($password,$user["create_time"]);
        if($user["password"]!==$password){
            $this->error="密码错误";
            return false;
        }
        return $user;
    }
    /**
     * 创建用户记录
     * @see self::checkUnique() 注册前应检查是否有重复
     * @param string[] $data 用户数据
     * @param string $token 当前用户token
     * @param string $ip 当前用户IP
     * @return string 新用户ID
     */
    public function register($data,$token,$ip,$time=null)
    {
        if($time === null) $time = time();
        $data["last_login_time"]=$time;
        $data["create_time"]=$time;
        $data["last_login_ip"]=$ip;
        $data["token"]=$token;
        unset($data["id"],$data["score"],$data["coin"],$data["status"]);
        $result=$this->isUpdate(false)->save($data);
        if($result===false){
            $this->error="保存数据失败";
            return false;
        }
        return $this["id"];
    }
    /**
     * 修改登录记录
     * @see self::checkUser() 登录前需要检查用户是否存在，密码是否正确(或者其他形式的验证)
     * @param string[] $uid 用户编号
     * @param string $token 当前用户token
     * @param string $ip 当前用户IP
     * @return bool
     */
    public function login($uid,$token,$ip,$time=null)
    {
        if($time === null) $time = time();
        $result = $this->db()->where(["id"=>$uid])->update([
            "last_login_time" => $time,
            "last_login_ip" => $ip,
            "token" => $token,
        ]);
        return $result;
    }
    /**
     * 使用用户ID、用户昵称或者手机号查找用户
     * 严格查找
     * @param string $name id/username/mobile
     * @return self|false
     */
    public function findUser($name)
    {
        $info=$this->db()->where("`id` = '$name' OR `mobile` = '$name' OR `username` = '$name'")->find();
        if(!$info){
            $this->error="用户不存在";
            return false;
        }
        return $info;
    }
    /**
     * 使用用户ID、用户昵称或者手机号查找用户
     * 模糊查找
     * @param string $string
     * @return self[]
     */
    public function searchUser($string)
    {
        return $this->db()->where("`id` LIKE '%$string%' OR `mobile` LIKE '%$string%' OR `username` LIKE '%$string%'")->select();
    }
    /**
     * 修改用户简介
     */
    public function updateProfile($id,$data)
    {
        $result = $this->allowField(["nickname","avatar","signature","sex","birthday","url"])->isUpdate(true)->save($data,["id"=>$id]);
        if($result===false){
            $this->error="修改用户简介失败";
            return false;
        }
        return true;
    }
}
